package com.demo.commons.genertator;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.demo.commons.genertator.eneity.Rule;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zwy
 * @date 2023/7/22 20:01
 * 代码生成器
 */
public class GeneratorTest {
    public static void main(String[] args) {
        new GeneratorTest().generator();
    }
    /**
     * 代码生成器      mybatisPlus
     * <dependency>
     * <groupId>com.baomidou</groupId>
     * <artifactId>mybatis-plus-generator</artifactId>
     * <version>3.4.1</version>
     * </dependency>
     * <dependency>
     * <groupId>org.apache.velocity</groupId>
     * <artifactId>velocity-engine-core</artifactId>
     * <version>2.0</version>
     * </dependency>
     */

    @Test
    public void generator() {

        /**
         * 通过反射获取本类的路径
         */
        String pathName = GeneratorTest.class.getResource("/").getPath().substring(1).replace("/", "\\");
        System.out.println(pathName);
        pathName = pathName.substring(0, pathName.indexOf("target") - 1);
        System.out.println(pathName);
        String projectPath = pathName + Rule.rootPath;
        AutoGenerator ag = new AutoGenerator();
        /**
         * 1. 全局配置
         */
        GlobalConfig config = new GlobalConfig();
        String projectPath1 = pathName + Rule.classPath;
        /**
         * 作者
         */
        config.setAuthor("zwy")
                .setOutputDir(projectPath1)
                /**
                 * 是否文件覆盖，如果多次
                 */
                .setFileOverride(true)
                /**
                 * 主键策略
                 */
                .setIdType(IdType.AUTO)
                /**
                 * 设置生成的service接口名首字母不用I开头
                 */
                .setServiceName("%sService")
                /**
                 * 映射文件中生成默认的baseMap
                 */
                .setBaseResultMap(true)
                /**
                 * 映射文件中生成默认的基础列名sql
                 */
                .setBaseColumnList(true)
                /** 设置时间类型策略不兼容问题 */
                .setDateType(DateType.ONLY_DATE);
        /**
         * 数据源配置(**)
         */
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(Rule.dataBases+"?serverTimezone=GMT%2B8&useUnicode=true&useSSL=false&characterEncoding=utf8");
        /**
         * dsc.setSchemaName("public");
         */
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername(Rule.username);
        dsc.setPassword(Rule.password);
        /**
         * 3.策略配置
         */
        StrategyConfig stConfig = new StrategyConfig();
        /**
         * 全局大写命名
         */
        stConfig.setCapitalMode(true)
                /**
                 * 下划线转驼峰
                 */
                .setNaming(NamingStrategy.underline_to_camel)
                /**
                 * 生成的表,参数为数组
                 */
                .setInclude(new String[]{Rule.tableName});
        /**
         * 4.包名策略
         */
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent(Rule.packageNameParent);
        pkConfig.setEntity(Rule.packageNameEntity);
        pkConfig.setMapper(Rule.packageNameMapper);
        pkConfig.setService(Rule.packageNameService);
        pkConfig.setServiceImpl(Rule.packageNameServiceImpl);
        pkConfig.setController(Rule.packageNameController);
        ag.setPackageInfo(pkConfig);
        /**
         * 5.生成xml的配置
         */
        List<FileOutConfig> focList = new ArrayList<>();
        /**
         * 自定义配置
         */
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
            }
        };
        String templatePath = "/templates/mapper.xml.vm";
        /**
         * 自定义配置会被优先输出
         */
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                System.out.println(projectPath.substring(0, projectPath.indexOf("java")) + "/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML);
                /**
                 * 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                 */
                return projectPath.substring(0, projectPath.indexOf("java")) + "\\resources\\mapper\\" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        /**
         * 配置模板
         */
        TemplateConfig templateConfig = new TemplateConfig();
        /**
         * 不生成如下类型模板
         */
        templateConfig.setXml(null);
        ag.setTemplate(templateConfig);
        /**
         * 6.整合配置
         */
        ag.setGlobalConfig(config)
                .setDataSource(dsc)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig)
                .setCfg(cfg)
                .setTemplateEngine(new VelocityTemplateEngine());
        ag.execute();
    }
}